package com.itheima.studentsystem;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<>();
        //定义一个学生管理系统集合，用于存储学生管理系统的信息
        ArrayList<StudentSystem> list1 = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        String choose;
        do {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作：1登录 2注册 3忘记密码 4退出");
            System.out.println("请输入您的选择：");
            choose = sc.next();
            switch (choose) {
                case "1" -> getIn(list);
                case "2" -> rigister(list);
                case "3" -> forgetPassword(list);
                case "4" -> System.out.println("退出！");
                default -> System.out.println("非法输入，请重新输入！");
            }
        } while (!choose.equals("4"));
    }

    //登录
    public static void getIn(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        String username;
        int index;
        while (true) {
            System.out.println("请输入用户名：");
            username = sc.next();
            index = getUserindex(list, username);
            if (index >= 0) {
                //表示用户名注册过了,跳出循环
                break;
            } else {
                System.out.println("用户未注册，请先注册！");
                return;
            }
        }

        //循环结束表示用户名输入成功,再判断验证码
        //用户输入的密码
        String password;
        //用户输入的验证码
        String number;
        //计算用户密码错误的次数
        int count = 0;
        while (count != 3) {
            String checknumber = getCheckNumber();///得到验证码
            System.out.println("验证码为：" + checknumber);
            System.out.println("请输入验证码：");
            number = sc.next();
            //先判断验证码是否正确
            if (!number.equalsIgnoreCase(checknumber)) {
                System.out.println("验证码输入错误，请重新输入：");
                continue;
            }
            System.out.println("验证码正确！");
            System.out.println("请输入密码:");
            password = sc.next();
            //判断用户名和密码是否正确
            if (password.equals(list.get(index).getPassword()) && username.equals(list.get(index).getUsername())) {
                //表示登录成功了,登录成功了就要进入系统了
                StudentSystem St = new StudentSystem();
                //调用学生系统的方法就行了
                St.StudentSystem();
                return;
            } else {
                //表示登录失败了
                count++;
                System.out.println("您输入的用户名或密码错误，请重新输入：(您还有" + (3 - count) + "次机会)");
            }
        }
    }

    //注册
    public static void rigister(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        String username;
        //唯一性判断
        while (true) {
            System.out.println("请输入用户名：");
            username = sc.next();
            int index = getUserindex(list, username);
            if (index >= 0) {
                System.out.println("用户名已经存在，请重新输入：");
            } else {
                //表示用户名不重复
                //对username的长度进行判断
                if (username.length() >= 3 && username.length() <= 15) {
                    //表示长度合法,再判断用户名的格式和是否是纯数字
                    if (usernameStyle(username)) {
                        //用户名格式合法，跳出循环，不用继续输入了
                        System.out.println("用户名输入成功！");
                        break;
                    } else {
                        System.out.println("用户名格式非法，请重新输入：");
                    }
                } else {
                    //长度非法
                    System.out.println("用户名的长度非法，请重新输入：");
                }
            }
        }

        //当循环结束后，表示用户名录入成功
        //输入两次密码
        String password1;
        String password2;
        while (true) {
            System.out.println("请输入密码：");
            password1 = sc.next();
            System.out.println("请再次输入密码：");
            password2 = sc.next();
            //比较两次输入的密码
            if (password1.equals(password2)) {
                System.out.println("两次密码输入一致");
                break;
            } else {
                System.out.println("两次密码不一致，请重新输入：");
            }
        }

        //当循环结束表示密码录入成功
        //输入身份证号码
        String personid;
        while (true) {
            System.out.println("请输入身份证号码：");
            personid = sc.next();
            //判断身份证的长度
            if (personid.length() == 18) {
                //长度合法
                if (personid.charAt(0) == '0') {
                    System.out.println("身份证不能以0开头！");
                } else {
                    //再判断前17位
                    if (isNumber(personid)) {
                        //拿到身份证的最后一位
                        char lastNumber = personid.charAt(personid.length() - 1);
                        if ((lastNumber >= '0' && lastNumber <= '9') || lastNumber == 'X' || lastNumber == 'x') {
                            //满足条件，跳出循环
                            System.out.println("身份证号码输入成功！");
                            break;
                        } else {
                            //不满足条件
                            System.out.println("身份证最后一位不符合要求！");
                        }
                    } else {
                        System.out.println("前17位身份证号码不都为数字！");
                    }
                }
            } else {
                System.out.println("身份证的长度非法，请重新输入：");
            }
        }

        //当循环结束表示身份证输入成功
        //手机号验证
        String phoneNumber;
        while (true) {
            System.out.println("请输入手机号码：");
            phoneNumber = sc.next();
            if (phoneNumber.length() == 11) {
                //长度合法
                if (phoneNumber.charAt(0) == '0') {
                    System.out.println("手机号码不能以0开头！");
                } else {
                    if (isNumber(phoneNumber + "")) {
                        System.out.println("手机号码输入成功！");
                        break;
                    } else {
                        System.out.println("手机号码不都为数字！");
                    }
                }
            } else {
                System.out.println("手机号码长度非法，请重新输入：");
            }
        }

        //循环结束表示手机号码输入成功
        //创建一个User对象
        User u = new User(username, password1, personid, phoneNumber);

        //把User对象添加到集合中
        list.add(u);
        System.out.println("注册成功！");
    }

    //修改
    public static void forgetPassword(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        String username;
        int index;
        while (true) {
            System.out.println("请输入用户名：");
            username = sc.next();
            index = getUserindex(list, username);
            if (index >= 0) {
                //表示用户名注册过了,跳出循环
                break;
            } else {
                System.out.println("用户未注册，请先注册！");
                return;
            }
        }

        //循环结束表示用户名输入成功,再判断身份证号码和手机号码是否相等
        //用户输入的身份证号码
        System.out.println("请输入您的身份证号码：");
        String personid = sc.next();
        //用户输入的手机号码
        System.out.println("请输入您的手机号码：");
        String phonenumber = sc.next();

        if (personid.equals(list.get(index).getPersonid()) && phonenumber.equals(list.get(index).getPhoneNumber())) {
            //身份证号码和手机号码相等，就修改
            System.out.println("请输入您要修改的密码");
            String newpassword = sc.next();
            list.get(index).setPassword(newpassword);
            System.out.println("修改成功！");
        } else {
            //身份证号码和手机号码不相等
            System.out.println("您输入的身份证号码或手机号码错误，修改失败！");
            return;
        }
    }

    //判断用户名重不重复
    public static int getUserindex(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getUsername().equals(username)) {
                return i;
            }
        }
        return -1;
    }

    //定义一个方法判断用户名的格式
    public static boolean usernameStyle(String username) {
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if ((c < 'a' && c > 'z') || (c < 'A' && c > 'Z') || (c < '0' && c > '9')) {
                //表示用户名非法
                return false;
            }
        }
        //如果执行到这，说明用户名合法,再判断用户名是不是纯数字
        int count = 0;  //计算有多少个英文字符
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                count++;
            }
        }
        //循环结束就计算出count的数目
        if (count > 0) {
            return true;
        }
        return false;
    }

    //定义方法判断身份证前17位是否都是数字
    public static boolean isNumber(String personid) {
        for (int i = 0; i < personid.length() - 1; i++) {
            char c = personid.charAt(i);
            if (c < '0' || c > '9') {
                return false;
            }
        }
        return true;
    }

    //定义方法用于生成验证码
    public static String getCheckNumber() {
        //1.把大小写字母都存放到一个数组当中
        char[] arr = new char[52];
        //第一次循环存放大写字母
        for (int i = 0; i < 26; i++) {
            arr[i] = (char) (i + 65);
        }
        //第二次循环存放小写字母
        for (int i = 26; i < arr.length; i++) {
            arr[i] = (char) (97 + i - 26);
        }

        //2.随机生成4个索引
        Random r = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(52);
            sb.append(arr[index]);
        }

        //3.添加1-9中的一个数,把字符串变成字符数组
        char[] arr1 = sb.append(r.nextInt(10)).toString().toCharArray();

        //4.随机数打乱顺序
        for (int i = 0; i < arr1.length; i++) {
            //随机生成索引
            int index = r.nextInt(arr1.length);
            //交换数据
            char tmp = arr1[i];
            arr1[i] = arr1[index];
            arr1[index] = tmp;
        }

        //5.把字符数组变回字符串
        String result = new String(arr1);
        return result;
    }
}
